其他
扛住100亿次请求——如何做一个“有把握”的春晚红包系统
注:本文以及作者所有内容,仅代表个人理解和实践,过程和微信团队没有任何关系,真正的线上系统也不同,只是从一些技术点进行了实践,请读者进行区分。
背景知识
QPS: Queries per second 每秒的请求数目;
确定目标
用户总数:
服务器数量:
单机需要支持的负载数:
单机峰值QPS:
发放红包:
总结:
支持至少100万连接用户 每秒至少能处理2.3万的QPS,这里我们把目标定得更高一些 分别设定到了3万和6万。 摇红包:支持每秒83个的速度下发放红包,也就是说每秒有2.3万次摇红包的请求,其中83个请求能摇到红包,其余的2.29万次请求会知道自己没摇到。当然客户端在收到红包以后,也需要确保客户端和服务器两边的红包数目和红包内的金额要一致。因为没有支付模块,所以我们也把要求提高一倍,达到200个红包每秒的分发速度 支持用户之间发红包业务,确保收发两边的红包数目和红包内金额要一致。同样也设定200个红包每秒的分发速度为我们的目标。
基础软件和硬件
软件:
服务器操作系统:Ubuntu 12.04
客户端操作系统:debian 5.0
硬件环境:
服务器硬件版本:
技术分析和实现
单机实现100万用户连接
3万QPS
客户端QPS:
服务器QPS:
第二:,我们需要监控网络,因为网络的吞吐情况,可以客观的反映出QPS的真实数据。为此,我利用python脚本 结合ethtool 工具编写了一个简单的工具,通过它我们可以直观的监视到网络的数据包通过情况如何。它可以客观的显示出我们的网络有如此多的数据传输在发生。
摇红包业务
发红包业务
监控
代码实现及分析
在SET内部,有一个工作goroutine,它只做非常简单而高效的事情,它做的事情如下,检查SET的接受消息,它会收到3类消息:
1、客户端的摇红包请求消息 2、 客户端的其他消息 比如聊天 好友这一类 3、 服务器端对客户端消息的回应
对于第2种消息 客户端的其他消息 比如聊天 好友这一类,只需简单地从队列里拿走消息,转发给后端的聊天服务队列即可,其他服务会把消息转发出去。
对于第3种消息 服务器端对客户端消息的回应。SET 只需要根据消息里的用户id,找到SET里保留的用户连接对象,发回去就可以了。
https://github.com/xiaojiaqi/10billionhongbaos
实践
阶段1
Alias ss2=Ss –ant | grep 1025 | grep EST | awk –F: “{print $8}” | sort | uniq –c’
阶段2
阶段3
分析数据
当非常多goroutine 同时运行的时候,依靠sleep 定时并不准确,发生了偏移。我觉得这是golang本身调度导致的。当然如果cpu比较强劲,这个现象会消失。 因为网络的影响,客户端在发起连接时,可能发生延迟,导致在前1秒没有完成连接。 服务器负载较大时,1000M网络已经出现了丢包现象,可以通过ifconfig 命令观察到这个现象,所以会有QPS的波动。
总结
单机百万的实践 https://github.com/xiaojiaqi/C1000kPracticeGuide 如何在AWS上进行100万用户压力测试 https://github.com/xiaojiaqi/fakewechat/wiki/Stress-Testing-in-the-Cloud 构建一个你自己的类微信系统 https://github.com/xiaojiaqi/fakewechat/wiki/Design http://djt.qq.com/article/view/1356 http://techblog.cloudperf.net/2016/05/2-million-packets-per-second-on-public.html http://datacratic.com/site/blog/1m-qps-nginx-and-ubuntu-1204-ec2 @火丁笔记 http://huoding.com/2013/10/30/296 https://gobyexample.com/non-blocking-channel-operation
详谈4大主流CPU处理器技术架构 华为麒麟1020首曝光;全球首款 5G 扩展现实平台发布;英特尔将开拓“全硅”市场;京东周伯文掌舵,申元庆出局…… 32 岁被裁员,拿完 N+1月工资,我高兴地失业了 后深度学习时代的一大研究热点?论因果关系及其构建思路 劳荣枝潜逃 23 年落网,多亏了它!